const a: (string | number)[] = ['a', 'b'];
const b: { prop: string }[] = [{ prop: 'a' }];
const c: (() => void)[] = [() => {}];
const d: Array<MyType> = ['a', 'b'];
const e: Array<string> = ['a', 'b'];
const f: ReadonlyArray<string> = ['a', 'b'];

let a: Array<number> = [];

let a: (string | number)[] = [];

let a: ReadonlyArray<number> = [];

let x: Array<undefined> = [undefined] as undefined[];

let y: string[] = <Array<string>>['2'];

let z: Array = [3, '4'];

let ya = [[1, '2']] as [number, string][];

type Arr<T> = Array<T>;

let yyyy: Arr<Array<Arr<string>>[]> = [[[['2']]]];

interface ArrayClass<T> {
  foo: Array<T>;
  bar: T[];
  baz: Arr<T>;
  xyz: this[];
}

function barFunction(bar: ArrayClass<String>[]) {
  return bar.map(e => e.bar);
}

let barVar: ((c: number) => number)[];

type barUnion = (string | number | boolean)[];

type barIntersection = (string & number)[];

let v: Array<fooName.BarType> = [{ bar: 'bar' }];

let w: fooName.BazType<string>[] = [['baz']];

let x: Array;

let x: Array<>;